﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ProyectA
{
    public partial class formElementosFactura : Form
    {
        private int FilaActual { get; set; }

        private float fTotalAcumulado;

        private float TotalFactura 
        { 
            get; 
            set; 
        }

        private int RegistroFacturaId
        {
            get;
            set;
        }

        private float TotalAcumulado 
        {
            get
            {
                return fTotalAcumulado;
            }

            set
            {
                lTotalAcumuladoValor.Text = value.ToString("C");
                lValorRestante.Text = (TotalFactura - value).ToString("C");
                if (value > TotalFactura)
                {
                    btSalvarElementoFactura.Enabled = false;
                    btAgregarElementoFactura.Enabled = false;
                    throw new Exception("Los Valores Ingresados son incorrectos por favor reviselos");
                }
                else
                {

                    fTotalAcumulado = value;

                    if (TotalFactura - value == 0)
                    {
                        btAgregarElementoFactura.Enabled = false;
                        btSalvarElementoFactura.Enabled = true;
                    }
                    else
                    {
                        btAgregarElementoFactura.Enabled = true;
                        btSalvarElementoFactura.Enabled = false;
                    }
                }
            }
        }

        private int CentroCostosId { get; set; }

        ProjectA.wsGeneral.WsGeneral wsGeneral = new ProjectA.wsGeneral.WsGeneral();

        DataSet dsEstructura;
        List<Item> Items;

        public formElementosFactura()
        {
            InitializeComponent();
            TotalFactura = 100;
            TotalAcumulado=0;
            dsEstructura = new DataSet();
            Items = new List<Item>();
        }

        public formElementosFactura(float fTotalFactura, int iCentroCostosId, int iRegistroFacturaId)
        {
            InitializeComponent();
            TotalFactura = fTotalFactura;
            TotalAcumulado = 0;
            CentroCostosId = iCentroCostosId;
            RegistroFacturaId = iRegistroFacturaId;
            dsEstructura = new DataSet();
            Items = new List<Item>();

        }

        private void formElementosFactura_Load(object sender, EventArgs e)
        {
            DataSet dsElementosAsociados = new DataSet();
            string sErr = "";

           

                if (wsGeneral.GetItems(null, RegistroFacturaId, null, null, null, null, null, null, out dsElementosAsociados, out sErr))
                {
                    dsPrincipal.Tables["ElementosAsociadosFactura"].Clear();
                    dsPrincipal.Load(dsElementosAsociados.CreateDataReader(), LoadOption.OverwriteChanges, "ElementosAsociadosFactura");

                    //DataTable dtData = new DataTable();
                    //dtData = dsGeneral1.Tables["ElementosAsociadosFactura"].Copy();
                }



            if (wsGeneral.GetEstructura(null, CentroCostosId, null, null, null, null, null, out dsEstructura, out sErr))
            {
                dsPrincipal.Tables["Estructura"].Clear();
                dsPrincipal.Load(dsEstructura.CreateDataReader(), LoadOption.OverwriteChanges, "Estructura");
                ArmandoEstructura(0, null);
                cbElementoEstructura.DataSource = Items;
                cbElementoEstructura.DisplayMember = "Name";
                cbElementoEstructura.ValueMember = "ItemId";

            }
            cbElementoEstructura.SelectedIndex = -1;

            CalculoAcumulado();

        }

        private void btAgregarElementoFactura_Click(object sender, EventArgs e)
        {
            if (cbElementoEstructura.SelectedIndex != -1)
            {
                if (TotalAcumulado < TotalFactura)
                {
                    DataRow dr = dsPrincipal.Tables["ElementosAsociadosFactura"].NewRow();
                    dr["ID"] = 0;
                    dr["RegistroFacturaID"] = RegistroFacturaId;
                    dr["EstructuraID"] = cbElementoEstructura.SelectedValue;
                    dr["EDescripcion"] = cbElementoEstructura.Text;
                    dr["Descripcion"] = null;
                    dr["Cantidad"] = 0;
                    dr["UnidadMedida"] = null;
                    dr["CostoXUnidad"] = 0;
                    dr["CostoTotal"] = 0;
                    dsPrincipal.Tables["ElementosAsociadosFactura"].Rows.Add(dr);
                    cbElementoEstructura.SelectedIndex = -1;
                }

                else
                {
                    MessageBox.Show("No puede agregar mas elementos a la factura, el valor de los acumulado equivale al valor de la factura agregada",
                        "ProjectA", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
            else
            {
                MessageBox.Show("Por favor elija un elemento de la estructura",
                       "ProjectA", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }

        }

        private void btSalvarElementoFactura_Click(object sender, EventArgs e)
        {

            try
            {
                string sErr = "";
                bool bResp = true;
                for (int iCount = 0; iCount < dgvElementoFactura.RowCount; iCount++)
                {
                    int iRegistroElementoFactura;

                    if (int.Parse(dgvElementoFactura.Rows[iCount].Cells[0].Value.ToString()) == 0) //Adición
                    {
                        if (!wsGeneral.AddItems(RegistroFacturaId, int.Parse(dgvElementoFactura.Rows[iCount].Cells[2].Value.ToString()),
                            int.Parse(dgvElementoFactura.Rows[iCount].Cells[5].Value.ToString()),
                            float.Parse(dgvElementoFactura.Rows[iCount].Cells[7].Value.ToString()),
                            float.Parse(dgvElementoFactura.Rows[iCount].Cells[8].Value.ToString()),
                            dgvElementoFactura.Rows[iCount].Cells[6].Value.ToString(),
                            dgvElementoFactura.Rows[iCount].Cells[4].Value.ToString(),
                            out iRegistroElementoFactura, out sErr))
                        {
                            bResp = false;
                        }
                        else
                        {
                            dgvElementoFactura.Rows[iCount].Cells[0].Value = iRegistroElementoFactura;
                        }
                    }

                    else
                    {
                        if (!wsGeneral.ModifyItems(int.Parse(dgvElementoFactura.Rows[iCount].Cells[0].Value.ToString()),
                            RegistroFacturaId, int.Parse(dgvElementoFactura.Rows[iCount].Cells[2].Value.ToString()),
                            int.Parse(dgvElementoFactura.Rows[iCount].Cells[5].Value.ToString()),
                            float.Parse(dgvElementoFactura.Rows[iCount].Cells[7].Value.ToString()),
                            float.Parse(dgvElementoFactura.Rows[iCount].Cells[8].Value.ToString()),
                            dgvElementoFactura.Rows[iCount].Cells[6].Value.ToString(),
                            dgvElementoFactura.Rows[iCount].Cells[4].Value.ToString(),
                            out sErr))
                        {
                            bResp = false;
                        }
                    }

                }

                if (bResp)
                {
                    MessageBox.Show("Datos Guardados exitosamente");
                }
                else
                {
                    MessageBox.Show("Todos los datos no se almacenaron");
                }
            }
            catch (Exception exc)
            {

            }
        }


        private void dgvElementosFactura_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (e.RowIndex > -1)
                {
                    if ((e.ColumnIndex == 5)||(e.ColumnIndex == 7))
                    {
                        float.Parse(dgvElementoFactura.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());
                        if ((dgvElementoFactura.Rows[e.RowIndex].Cells[7].Value != null) && (dgvElementoFactura.Rows[e.RowIndex].Cells[5].Value != null))
                        {
                            dgvElementoFactura.Rows[e.RowIndex].Cells[8].Value = (object)((float.Parse(dgvElementoFactura.Rows[e.RowIndex].Cells[7].Value.ToString()) * float.Parse(dgvElementoFactura.Rows[e.RowIndex].Cells[5].Value.ToString())));
                            CalculoAcumulado();
                        }
                    }
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message);
            }

        }

        private void btEliminarElementoFactura_Click(object sender, EventArgs e)
        {
            string sErr="";
            if (dgvElementoFactura.Rows[FilaActual].Cells[0].Value != null)
            {
                if (wsGeneral.DeleteItems(int.Parse(dgvElementoFactura.Rows[FilaActual].Cells[0].Value.ToString()), out sErr))
                {
                    MessageBox.Show("Eliminación Exitosa");
                }
            }

            dgvElementoFactura.Rows.Remove(dgvElementoFactura.Rows[FilaActual]);
            CalculoAcumulado();


        }

        private void dgvElementosFactura_CellClick(object sender, DataGridViewCellEventArgs e)
        {
           
            FilaActual = e.RowIndex;
        }

        private void CalculoAcumulado()
        {
            TotalAcumulado = 0;
            for (int iRows = 0; iRows < dgvElementoFactura.Rows.Count; iRows++)
            {
                TotalAcumulado = TotalAcumulado + float.Parse(dgvElementoFactura.Rows[iRows].Cells[8].Value.ToString());
            }
        }

        private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e)
        {

        }

        private void formElementosFactura_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (TotalFactura - TotalAcumulado != 0)
            {
                MessageBox.Show("Faltan Elementos por registrar!",
                       "ProjectA", MessageBoxButtons.OK, MessageBoxIcon.Error);
                e.Cancel = true;
            }

        }


        private void ArmandoEstructura(int indicePadre, string sEspace)
        {
            try
            {

                // Crear un DataView con los Nodos que dependen del Nodo padre pasado como parámetro.
                DataView dataViewHijos = new DataView(dsEstructura.Tables[0]);
                dataViewHijos.RowFilter = dsEstructura.Tables[0].Columns["MaestroID"].ColumnName + " = " + indicePadre;
                if (indicePadre != 0)
                    sEspace = sEspace + " ";

                // Agregar al TreeView los nodos Hijos que se han obtenido en el DataView.
                foreach (DataRowView dataRowCurrent in dataViewHijos)
                {
                    string sName = sEspace + dataRowCurrent["Descripcion"].ToString();
                    Item Item = new formElementosFactura.Item();
                    Item.ItemId = int.Parse(dataRowCurrent["ID"].ToString());
                    Item.Name = sName;
                    Items.Add(Item);


                    // Llamada recurrente al mismo método para agregar los Hijos del Nodo recién agregado.
                    ArmandoEstructura(Int32.Parse(dataRowCurrent["ID"].ToString()), sEspace);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

        class Item
        {
            public int ItemId { get; set; }
            public string Name { get; set; }
        }

                 
    }
}
